-- BEGIN;

ALTER TABLE kinorezerwacja_miejsce DROP CONSTRAINT kinorezerwacja_msc_const_unique_rzad_msc;
ALTER TABLE kinorezerwacja_klient DROP CONSTRAINT kinorezerwacja_klient_const_unique_login;
ALTER TABLE kinorezerwacja_film DROP CONSTRAINT kinorezerwacja_film_czas_trwania_dod;
ALTER TABLE kinorezerwacja_film DROP CONSTRAINT kinorezerwacja_film_premiery_ok;
ALTER TABLE kinorezerwacja_miejsce DROP CONSTRAINT kinorezerwacja_miejsce_rzad_ok;
ALTER TABLE kinorezerwacja_miejsce DROP CONSTRAINT kinorezerwacja_miejsce_msc_ok;
ALTER TABLE kinorezerwacja_limit_rezerwacji DROP CONSTRAINT kinorezerwacja_limit_r_ok;
ALTER TABLE kinorezerwacja_promocja DROP CONSTRAINT kinorezerwacja_promocja_czas_ok;
ALTER TABLE kinorezerwacja_promocja DROP CONSTRAINT kinorezerwacja_promocja_seanse_ok;
ALTER TABLE kinorezerwacja_promocja DROP CONSTRAINT kinorezerwacja_promocja_typ_ok;
ALTER TABLE kinorezerwacja_promocja DROP CONSTRAINT kinorezerwacja_promocja_wart_ok;
ALTER TABLE kinorezerwacja_instancja_miejsca DROP CONSTRAINT kinorezerwacja_inst_msc_stan_ok;
ALTER TABLE kinorezerwacja_awaria DROP CONSTRAINT kinorezerwacja_awaria_czego_ok;
ALTER TABLE kinorezerwacja_awaria DROP CONSTRAINT kinorezerwacja_awaria_czas_ok;
ALTER TABLE kinorezerwacja_typ_biletu DROP CONSTRAINT kinorezerwacja_typ_bil_cena_dod;
ALTER TABLE kinorezerwacja_seans DROP CONSTRAINT kinorezerwacja_seans_po_premierze;
ALTER TABLE kinorezerwacja_awaria DROP CONSTRAINT kinorezerwacja_awaria_czego_klucz_ok;
ALTER TABLE kinorezerwacja_seans DROP CONSTRAINT kinorezerwacja_seans_nie_zachodza_na_siebie;
ALTER TABLE kinorezerwacja_sala DROP CONSTRAINT kinorezerwacja_sala_przerwa_dod;
ALTER TABLE kinorezerwacja_seans DROP CONSTRAINT kinorezerwacja_seans_jeden_film_na_raz;
ALTER TABLE kinorezerwacja_rezerwacja DROP CONSTRAINT kinorezerwacja_rezerwacja_nie_przekroczony_limit;
ALTER TABLE kinorezerwacja_mozliwy_bilet DROP CONSTRAINT kinorezerwacja_mozliwy_bilet_unique;
ALTER TABLE kinorezerwacja_typ_biletu DROP CONSTRAINT kinorezerwacja_typ_biletu_unique;
ALTER TABLE kinorezerwacja_ranga DROP CONSTRAINT kinorezerwacja_ranga_unique;
ALTER TABLE kinorezerwacja_limit_rezerwacji DROP CONSTRAINT kinorezerwacja_limit_rezerwacji_jedna_dla_rangi;
ALTER TABLE kinorezerwacja_rezerwacja DROP CONSTRAINT kinorezerwacja_maks_jedna_rezerwacja_na_miejsce;
ALTER TABLE kinorezerwacja_instancja_miejsca DROP CONSTRAINT kinorezerwacja_instancja_miejsca_jedna_instancja_na_seans;
ALTER TABLE kinorezerwacja_film DROP CONSTRAINT kinorezerwacja_film_tytul_unique;
ALTER TABLE kinorezerwacja_budynek DROP CONSTRAINT kinorezerwacja_budynek_adres_unique;


ALTER TABLE kinorezerwacja_miejsce ADD CONSTRAINT kinorezerwacja_msc_const_unique_rzad_msc
    UNIQUE(id_sali, rzad, miejsce);
ALTER TABLE kinorezerwacja_klient ADD CONSTRAINT kinorezerwacja_klient_const_unique_login
    UNIQUE(login);
ALTER TABLE kinorezerwacja_film ADD CONSTRAINT kinorezerwacja_film_czas_trwania_dod
    CHECK(czas_trwania >= 1);
ALTER TABLE kinorezerwacja_film ADD CONSTRAINT kinorezerwacja_film_premiery_ok
    CHECK(premiera_w_polsce >= premiera);
ALTER TABLE kinorezerwacja_miejsce ADD CONSTRAINT kinorezerwacja_miejsce_rzad_ok
    CHECK(rzad >= 1);
ALTER TABLE kinorezerwacja_miejsce ADD CONSTRAINT kinorezerwacja_miejsce_msc_ok
    CHECK(miejsce >= 1);
ALTER TABLE kinorezerwacja_limit_rezerwacji ADD CONSTRAINT kinorezerwacja_limit_r_ok
    CHECK("limit" >= 1);    
ALTER TABLE kinorezerwacja_promocja ADD CONSTRAINT kinorezerwacja_promocja_czas_ok
    CHECK(do_rezerwacja IS NULL OR do_rezerwacja >= od_rezerwacja);    
ALTER TABLE kinorezerwacja_promocja ADD CONSTRAINT kinorezerwacja_promocja_seanse_ok
    CHECK(do_seans IS NULL OR do_seans >= od_seans);
ALTER TABLE kinorezerwacja_promocja ADD CONSTRAINT kinorezerwacja_promocja_typ_ok
    CHECK(typ = 'procentowa' OR typ = 'stala');
ALTER TABLE kinorezerwacja_promocja ADD CONSTRAINT kinorezerwacja_promocja_wart_ok
    CHECK((typ = 'stala' AND znizka > 0) OR (typ = 'procentowa' AND znizka > 0 AND znizka < 100));
ALTER TABLE kinorezerwacja_instancja_miejsca ADD CONSTRAINT kinorezerwacja_inst_msc_stan_ok
    CHECK(stan = 'wolny' OR stan = 'zarezerwowany' OR stan = 'kupiony' OR stan = 'niedostepny');
ALTER TABLE kinorezerwacja_awaria ADD CONSTRAINT kinorezerwacja_awaria_czego_ok
    CHECK(czego = 'sali' OR czego = 'miejsca');
ALTER TABLE kinorezerwacja_awaria ADD CONSTRAINT kinorezerwacja_awaria_czas_ok
    CHECK("do" IS NULL OR "do" > od);
ALTER TABLE kinorezerwacja_typ_biletu ADD CONSTRAINT kinorezerwacja_typ_bil_cena_dod
    CHECK(cena > 0);
ALTER TABLE kinorezerwacja_sala ADD CONSTRAINT kinorezerwacja_sala_przerwa_dod
    CHECK(czas_przerwy_technicznej > 0);
ALTER TABLE kinorezerwacja_seans ADD CONSTRAINT kinorezerwacja_seans_jeden_film_na_raz
    UNIQUE(id_sali, rozpoczecie);
ALTER TABLE kinorezerwacja_mozliwy_bilet ADD CONSTRAINT kinorezerwacja_mozliwy_bilet_unique
    UNIQUE(id_typu, id_seansu);
ALTER TABLE kinorezerwacja_typ_biletu ADD CONSTRAINT kinorezerwacja_typ_biletu_unique
    UNIQUE(opis);
ALTER TABLE kinorezerwacja_ranga ADD CONSTRAINT kinorezerwacja_ranga_unique
    UNIQUE(skrot);
ALTER TABLE kinorezerwacja_limit_rezerwacji ADD CONSTRAINT kinorezerwacja_limit_rezerwacji_jedna_dla_rangi
    UNIQUE(id_rangi);
ALTER TABLE kinorezerwacja_rezerwacja ADD CONSTRAINT kinorezerwacja_maks_jedna_rezerwacja_na_miejsce
    UNIQUE(id_instancji_miejsca);
ALTER TABLE kinorezerwacja_instancja_miejsca ADD CONSTRAINT kinorezerwacja_instancja_miejsca_jedna_instancja_na_seans
    UNIQUE(id_miejsca, id_seansu);
ALTER TABLE kinorezerwacja_film ADD CONSTRAINT kinorezerwacja_film_tytul_unique
    UNIQUE(tytul);        
ALTER TABLE kinorezerwacja_budynek ADD CONSTRAINT kinorezerwacja_budynek_adres_unique
    UNIQUE(adres);        

/* Sprawdza czy nasz seans jest po premierze w polsce*/
ALTER TABLE kinorezerwacja_seans ADD CONSTRAINT kinorezerwacja_seans_po_premierze
    CHECK(premiera_filmu(id_filmu) <= rozpoczecie);
/* Sprawdza czy awaria wskazuje na cos istniejacego*/
ALTER TABLE kinorezerwacja_awaria ADD CONSTRAINT kinorezerwacja_awaria_czego_klucz_ok
    CHECK(sprawdz_czy_awaria_ok(czego, id_obiektu) > 0);
/* Sprawdza czy seans nie zaczyna sie przed koncem poprzedniego, ani nie konczy po poczatku nastepnego*/
ALTER TABLE kinorezerwacja_seans ADD CONSTRAINT kinorezerwacja_seans_nie_zachodza_na_siebie
    CHECK(
        (   kolejny_seans(rozpoczecie, id_sali) IS NULL 
            OR czy_sie_nie_pokrywaja(
                rozpoczecie,
                czas_trwania(id_filmu),
                czas_rozpoczecia(kolejny_seans(rozpoczecie, id_sali)), 
                czas_przerwy_tech(id_sali)
                ) = 1
        ) AND (
            poprzedni_seans(rozpoczecie, id_sali) IS NULL
            OR czy_sie_nie_pokrywaja(
                czas_rozpoczecia(poprzedni_seans(rozpoczecie, id_sali)), 
                czas_trwania(pobierz_id_filmu(poprzedni_seans(rozpoczecie, id_sali))),
                rozpoczecie, 
                czas_przerwy_tech(id_sali)
                ) = 1
        ));
ALTER TABLE kinorezerwacja_rezerwacja ADD CONSTRAINT kinorezerwacja_rezerwacja_nie_przekroczony_limit
    CHECK(
        ile_max_rezerwacji(id_klienta) = -1
        OR
        ile_max_rezerwacji(id_klienta) > ile_rezerwacji_aktualnie(id_klienta)
    );
-- COMMIT;
